//二次封装axios 构造拦截器

import axios from 'axios'
import config from '../config'
import router from '../router'
import store  from '@/store'
//设置配置 根据开发和生产环境不一样，
//需要跨域的时候 需要更改
const baseUrl = process.env.NODE_ENV == 'development' ? config.baseUrl.dev : config.baseUrl.pro
class HttpRequest {
  //初始化
  constructor(baseUrl) {
    this.baseUrl = baseUrl
  }
  getInsideConfig() {
    const config = {
      baseURL: this.baseUrl,
      contentType: 'application/json',
      processData: true
    }
    return config
  }

  interceptors(instance) {
    instance.interceptors.request.use(function (config) {
      // 在发送请求之前做些什么
      // config.headers['Access-Control-Allow-Creadentials']=true
      const token = window.sessionStorage.getItem('token')
      if (token) { // 判断是否存在token，如果存在的话，则每个http header都加上token
        config.headers.Authorization = token  //请求头加上token
      }
      // console.log(config)
      return config;
    }, function (error) {
      // 对请求错误做些什么
      // console.log(config)
      return Promise.reject(error);
    });

    // 添加响应拦截器 接受两个回调函数 一个是成功，一个是失败
    instance.interceptors.response.use(function (response) {
      // 对响应数据做点什么
      const res = response.data
      
      if (response.data == 401) {
        if (flag === 0) {
          flag++;
          // 警告提示窗
          let msg = '登录状态已过期，您可以继续留在该页面，或者重新登录';
          MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }

          ).then(() => {
            //清空sessionstore
            window.sessionStorage.removeItem("token");
            window.sessionStorage.removeItem("userInfo");
            //重定位路由跳转，后面需要重新修改  ，这里给定位到首页
            router.push('/login');
          })
          // 若后台返回错误值，此处返回对应错误对象，下面 error 就会接收
          return Promise.reject(new Error(res.data || 'Error'));
        }

      } else {
        // 注意返回值
        return response.data;
      }
    }, function (error) {
      // 对响应错误做点什么
      let { message } = error;
      if (message == "Network Error") {
        message = "后端接口连接异常";
      }
      else if (message.includes("timeout")) {
        message = "系统接口请求超时";
      }
      else if (message.includes("Request failed with status code 401")) {
        message = `登录身份已过期，请重新登录`
        window.sessionStorage.removeItem("token");
        window.sessionStorage.removeItem("store");
        store.commit('changeOffOnline')
        router.push('/home')
      }
      ElMessage({
        message: message,
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(error);
    });
  }
  request(options) {
    const instance = axios.create()
    options = { ...(this.getInsideConfig()), ...options }
    this.interceptors(instance)
    return instance(options)
  }
}
export default new HttpRequest(baseUrl)